using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._RasterAnalysisTools._Hydrology
{
    /// <summary>
    /// <para>Stream Link</para>
    /// <para>Assigns unique values to sections of a raster linear network between intersections.</para>
    /// <para>为相交点之间的栅格线性网络的截面指定唯一值。</para>
    /// </summary>    
    [DisplayName("Stream Link")]
    public class StreamLink : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public StreamLink()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_inputStreamRaster">
        /// <para>Input Stream Raster</para>
        /// <para>An input raster that represents a linear stream network.</para>
        /// <para>表示线性流网络的输入栅格。</para>
        /// </param>
        /// <param name="_inputFlowDirectionRaster">
        /// <para>Input Flow Direction Raster</para>
        /// <para>The input raster that shows the direction of flow out of each cell.</para>
        /// <para>显示流出每个像元的方向的输入栅格。</para>
        /// </param>
        /// <param name="_outputName">
        /// <para>Output Name</para>
        /// <para><xdoc>
        ///   <para>The name of the output stream link raster service.</para>
        ///   <para>The default name is based on the tool name and the input layer name. If the layer name already exists, you will be prompted to provide another name.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出流链接栅格服务的名称。</para>
        ///   <para>默认名称基于工具名称和输入图层名称。如果图层名称已存在，系统将提示您提供其他名称。</para>
        /// </xdoc></para>
        /// </param>
        public StreamLink(object _inputStreamRaster, object _inputFlowDirectionRaster, object _outputName)
        {
            this._inputStreamRaster = _inputStreamRaster;
            this._inputFlowDirectionRaster = _inputFlowDirectionRaster;
            this._outputName = _outputName;
        }
        public override string ToolboxName => "Raster Analysis Tools";

        public override string ToolName => "Stream Link";

        public override string CallName => "ra.StreamLink";

        public override List<string> AcceptEnvironments => ["cellSize", "extent", "mask", "outputCoordinateSystem", "snapRaster"];

        public override object[] ParameterInfo => [_inputStreamRaster, _inputFlowDirectionRaster, _outputName, _outputRaster];

        /// <summary>
        /// <para>Input Stream Raster</para>
        /// <para>An input raster that represents a linear stream network.</para>
        /// <para>表示线性流网络的输入栅格。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Stream Raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _inputStreamRaster { get; set; }


        /// <summary>
        /// <para>Input Flow Direction Raster</para>
        /// <para>The input raster that shows the direction of flow out of each cell.</para>
        /// <para>显示流出每个像元的方向的输入栅格。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Flow Direction Raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _inputFlowDirectionRaster { get; set; }


        /// <summary>
        /// <para>Output Name</para>
        /// <para><xdoc>
        ///   <para>The name of the output stream link raster service.</para>
        ///   <para>The default name is based on the tool name and the input layer name. If the layer name already exists, you will be prompted to provide another name.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出流链接栅格服务的名称。</para>
        ///   <para>默认名称基于工具名称和输入图层名称。如果图层名称已存在，系统将提示您提供其他名称。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Name")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _outputName { get; set; }


        /// <summary>
        /// <para>Output Raster</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Raster")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _outputRaster { get; set; }


        public StreamLink SetEnv(object cellSize = null, object extent = null, object mask = null, object outputCoordinateSystem = null, object snapRaster = null)
        {
            base.SetEnv(cellSize: cellSize, extent: extent, mask: mask, outputCoordinateSystem: outputCoordinateSystem, snapRaster: snapRaster);
            return this;
        }

    }

}